package main

import "fmt"

// main
//
//	@Description: 它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式让客户端可以统一地处理单个对象和对象组合。
//
// 应用场景：
//
// 文件系统：如目录和文件的管理，可以通过组合模式将文件夹视为组合节点，文件视为叶子节点。
// 组织结构：如公司内部的部门和员工关系，可以通过组合模式将部门视为组合节点，员工视为叶子节点。
func main() {
	root := Dir{
		Name: "ROOT-目录",
		Children: []Node{
			Dir{
				Name: "一级目录",
				Children: []Node{
					File{
						Name: "二级文件",
					},
					Dir{
						Name: "二级目录",
						Children: []Node{
							File{
								Name: "三级文件",
							},
						},
					},
				},
			},
			File{
				Name: "一级文件",
			},
		},
	}
	root.Display("")
}

// Node
// @Description: 接口
type Node interface {
	Display(ident string)
}

// File
// @Description: 文件结构体-实现接口
type File struct {
	Name string
}

func (n File) Display(ident string) {
	fmt.Println(ident + n.Name)
}

// Dir
// @Description: 目录结构体-实现接口
type Dir struct {
	Name     string
	Children []Node
}

func (n Dir) Display(ident string) {
	fmt.Println(ident + n.Name)
	for _, child := range n.Children {
		child.Display(ident + "  ")
	}
}
